﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using System.IO;

namespace TnaguTetris
{
    /// <summary>
    /// Mängu baasloogika.
    /// </summary>
    class Mootor
    {
        Klotsid klotsid = new Klotsid();
        Highscore hiscore = new Highscore();
        Kasutajaliides kasutajaliides = new Kasutajaliides();

        public string[] hiscore_names; // hiscore nimede list
        public int[] hiscore_scores; // hiscore skooride list
        public double time = 0; // m2ngu aeg
        public int score = 0; // skoor
        public int scoreAntiCheat = 123456; // skoori kontrollimiseks, et keegi programmiga juurde ei lisaks skoori
        public int lines = 0; // h2vitatud ridu
        public int gameInfoY = 228; // k6rgus (kui teksti ilmub siis liigub nats yles poole ka)
        public float gameInfoTextAlpha = 0; // infoteksti l2bipaistvus
        public int musicState = 0; // muusika olek (0-ei m2ngi (lugu on alguses ja pole alustatud), 1-m2ngib, 2-paus)

        public int level = 0; // hetke level
        public int actualLevel = 0; // mitu levelit tegelikult m2ngu jooksul on t6usnud (selle j2rgi arvutatakse j2gmine level)
        public int dropSpeed = 100; // klotsi kukkusmiskiirus, s6ltub levelist
        public int showCheatLine = 0; // kas n2idatakse kuhu klots kukub
        public int scoreLimit = 0; // j2rgmise leveli skoori limiit
        public int music = 0; // muusika 0-off, 1-on
        public int sfx = 0; // heliefektid 0-off, 1-on

        public int[,] board = new int[20, 10]; // m2nguplats (siia salvestatakse hallid klotsid)

        /// <summary>
        /// Klassi konstruktor
        /// </summary>
        public Mootor(Klotsid klotsidO)
        {
            this.klotsid = klotsidO;
        }

        /// <summary>
        /// kontrollib kas t2ht on mingis string massiivis
        /// </summary>
        /// <param name="chr">Otsitav täht</param>
        /// <param name="mass">Mahuti kust otsime</param>
        /// <returns>Jah, täht on olemas = true</returns>
        public bool In_array(string chr, string[] mass)
        {
            for (int i = 0; i < mass.GetLength(0); i++)
            {
                if (mass[i] == chr)
                {
                    return true;
                }
            }
            return false;
        }

        public bool shift = true;
        public string FormatChar(string chr)
        {
            if (chr.StartsWith("D") || chr.StartsWith("NumPad"))
                return chr.Substring(chr.Length-1, 1);
            else if (chr.Equals("OemPeriod") && shift)
                return ":";
            else if (chr.Equals("OemPeriod"))
                return ".";
            return null;
        }

        /// <summary>
        /// lisab nulli ajale kui aeg on v2iksem kui 10 (09, 08...)
        /// </summary>
        /// <param name="time">Aeg millele nulli tahame lisada</param>
        /// <returns>Tagastab aja nulliga</returns>
        public string Zero(int time)
        {
            if (time < 10)
            {
                return "0" + time;
            }
            return "" + time;
        }

        /// <summary>
        /// Kirjutab teksti valitud ala keskele
        /// </summary>
        /// <param name="width">Ala laius</param>
        /// <param name="offX">Mitu pikslit keskohast liigub X teljel</param>
        /// <param name="offY">Teksti asukoht Y teljel</param>
        /// <param name="text">Tekst, mis kirjutatakse ekraanile</param>
        /// <param name="font">Font</param>
        /// <param name="color">Teksti värv</param>
        /// <returns>Tagastab aja nulliga</returns>
        public void centerText(SpriteBatch sprite,int width, int offX, int offY, string text, SpriteFont font, Color color)
        {
            Vector2 textSize = font.MeasureString(text);
            Vector2 textCenter = new Vector2(offX + (width / 2), offY);
            sprite.DrawString(font, text, textCenter - (textSize / 2), color);
        }

        /// <summary>
        /// Joondab teksti paremale
        /// </summary>
        /// <param name="right">Teksti lõpu asukoht</param>
        /// <param name="top">Teksti asukoht Y teljel</param>
        /// <param name="text">Tekst, mis kirjutatakse ekraanile</param>
        /// <param name="font">Font</param>
        /// <param name="color">Teksti värv</param>
        /// <returns>Tagastab aja nulliga</returns>
        public void alignRight(SpriteBatch sprite, float right, float top, string text, SpriteFont font, Color color)
        {
            Vector2 textSize = font.MeasureString(text);
            Vector2 textRight = new Vector2(right - textSize.X, top);
            sprite.DrawString(font, text, textRight, color);
        }

        // teeb uue m2ngu ja alustab seda
        public void newGame()
        {
            hiscore_names = hiscore.ReadHiScoreNames();
            hiscore_scores = hiscore.ReadHiScoreScores();
            Array.Sort(hiscore_scores, hiscore_names);
            Array.Reverse(hiscore_scores);
            Array.Reverse(hiscore_names);

            loadOptions();
            actualLevel = 0;
            musicState = 0;
            time = 0;
            scoreAntiCheat = 123456;
            score = 0;
            lines = 0;
            gameInfoY = 228;
            gameInfoTextAlpha = 0;
            klotsid.blockDownTime = 0;
            klotsid.didBlockMove = false;
            board = new int[20, 10];
            // 2 korda, sest muidu tuleb current_blockiks next_block ja seda on näha
            klotsid.generateFromBlocks();
            klotsid.generateFromBlocks();
        }

        public void loadOptions()
        {
            string curFile = @"options.xml";
            if (File.Exists(curFile))
            {
                level = kasutajaliides.GetOption("startLvl");
                dropSpeed = 100 - (level * 5);
                showCheatLine = kasutajaliides.GetOption("cheatLine");
                scoreLimit = kasutajaliides.GetOption("scoreLimit");
                music = kasutajaliides.GetOption("music");
                sfx = kasutajaliides.GetOption("sfx");
            }
            else
            {
                kasutajaliides.MakeXMLOptions();
                loadOptions();
            }
        }

        public int GetLevel()
        {
            return level;
        }
        public void SetLevel(int lvl)
        {
            level = lvl;
        }

        public int GetScoreLimit()
        {
            return scoreLimit;
        }
        public void SetScoreLimit(int score)
        {
            scoreLimit = score;
        }

        public int GetMusic()
        {
            return music;
        }
        public void SetMusic(int value)
        {
            music = value;
        }

        public int GetCheatLine()
        {
            return showCheatLine;
        }
        public void SetCheatLine(int value)
        {
            showCheatLine = value;
        }

        public int GetSfx()
        {
            return sfx;
        }
        public void SetSfx(int value)
        {
            sfx = value;
        }
    }
}
